package com.ruoyi.web.util;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ReflectUtil;
import org.apache.commons.collections4.CollectionUtils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

public class BeanTools {

    /**
     * 使用 BeanUtils 对集合进行内容拷贝
     *
     * @param source      原始数据
     * @param targetClass 目标类型
     * @param <E>         原数据类型
     * @param <T>         目标数据类型
     * @return 目标数据类型集合
     */
    public static <E, T> List<T> copyList(Collection<E> source, Class<T> targetClass) {
        if (CollectionUtils.isEmpty(source) || targetClass == null) {
            return new ArrayList<>();
        }
        return source.stream().map(s -> {
            T target = ReflectUtil.newInstance(targetClass);
            BeanUtil.copyProperties(s, target);
            return target;
        }).collect(Collectors.toList());
    }

    /**
     * 使用 BeanUtils 对对象进行内容拷贝
     *
     * @param source      原始数据
     * @param targetClass 目标类型
     * @param <E>         原数据类型
     * @param <T>         目标数据类型
     * @return 目标数据类型
     */
    public static <E, T> T copy(E source, Class<T> targetClass) {
        return copy(source, targetClass, false);
    }

    /**
     * 使用 BeanUtils 对对象进行内容拷贝， source 为空则返回值为空
     *
     * @param source      原始数据
     * @param targetClass 目标类型
     * @param defaultNull Source 为空时，默认值是否为 null，值是 false 时返回空对象
     * @param <E>         原数据类型
     * @param <T>         目标数据类型
     * @return 目标数据类型
     */
    public static <E, T> T copy(E source, Class<T> targetClass, boolean defaultNull) {
        if (defaultNull && source == null) {
            return null;
        }
        T target = ReflectUtil.newInstance(targetClass);
        if (source != null) {
            BeanUtil.copyProperties(source, target);
        }
        return target;
    }
}
